Obsidian TC 日別リスト 4
< Obsidian TC 日別リスト 3 || Obsidian TC 日別リスト 5 >
直近30日のタスクログを検索する
2024-10-08
dv.tableで表示するように変更⇒リンクが機能するようになった
省スペースのため、日付フォーマットを変更 yyyy/M/d に変更
https://scrapbox.io/files/6704c5fdb71ad6001dde3665.png
タスクがない日も表示
code:js
`dataviewjs
// 時間と分のフォーマット関数
function formatTime(minutes) {
let hours = Math.floor(minutes / 60);
let remainingMinutes = minutes % 60;
if (hours > 0) {
return ${hours}h${remainingMinutes}m;
} else {
return ${remainingMinutes}m;
}
}
// 曜日を日本語の一文字に変換する関数
function getJapaneseDayOfWeek(day) {
const daysInJapanese = {
"Sunday": "日",
"Monday": "月",
"Tuesday": "火",
"Wednesday": "水",
"Thursday": "木",
"Friday": "金",
"Saturday": "土"
};
return daysInJapaneseday;
}
// フィルターキーワードを取得するテキストボックスを作成
let filterInput = document.createElement('input');
filterInput.type = 'text';
filterInput.placeholder = 'フィルターキーワードを入力';
filterInput.style.marginBottom = '10px';
filterInput.style.width = '100%';
// "フィルタ" ボタンを作成
let filterButton = document.createElement('button');
filterButton.innerText = 'フィルタ';
filterButton.style.display = 'block';
filterButton.style.marginBottom = '20px';
// テキストボックスとボタンを最初に表示
dv.container.appendChild(filterInput);
dv.container.appendChild(filterButton);
// ボタンがクリックされたときのイベントリスナー
filterButton.addEventListener('click', async () => {
let filterKeyword = filterInput.value; // テキストボックスからキーワードを取得
let filterEnabled = filterKeyword.length > 0;
// 再検索の際に以前のテーブルやコンテンツをクリア
dv.container.innerHTML = "";
// 検索UIを再度表示
dv.container.appendChild(filterInput);
dv.container.appendChild(filterButton);
// 今日の日付を取得
let today = window.moment().startOf('day');
// 過去30日分の日付を取得
let startDate = today.clone().subtract(30, 'days');
// 日別タスクリストと実績時間を格納するオブジェクト
let tasksByDate = [];
// データビュープラグインを利用して過去30日分のタスクを取得
for (let i = 0; i <= 30; i++) {
let currentDate = startDate.clone().add(i, 'days');
let filePath = notes/${currentDate.format('YYYY-MM-DD')}.md; // デイリーノートのパス
let tasksForDay = [];
let totalMinutes = 0;
if (await app.vault.adapter.exists(filePath)) {
let fileContent = await dv.io.load(filePath);
let lines = fileContent.split('\n');
// 各行を確認して開始時刻、実績時間、タスクを抽出
lines.forEach(line => {
let match = line.match(/(\d{2}:\d{2})\s+(\d+)\s*\\\s*(.*)/); // 開始時刻、実績時間、タスク内容を正規表現で抽出
if (match) {
let startTime = match1; // 開始時刻
let minutes = parseInt(match2, 10); // 実績時間を数値に変換
let task = match3; // タスク内容
// ()内を削除してリンク部分を省略
task = task.replace(/\[(^\]+)\]\(^\)+\)/g, "$1");
// フィルター条件に一致するタスクのみ表示
if (!filterEnabled || task.includes(filterKeyword)) {
tasksForDay.push(${startTime} ${task} (${formatTime(minutes)}));
totalMinutes += minutes; // 実績時間を足し合わせる
}
}
});
}
// 日付ごとのタスクリストと実績時間の合計を保存(タスクがなくても空のタスクリストと0分を表示)
let dayOfWeek = getJapaneseDayOfWeek(currentDate.format('dddd')); // 曜日を取得して日本語の一文字に変換
tasksByDate.push({
date: ${currentDate.format('M/D')}(${dayOfWeek}),
tasks: tasksForDay.length > 0 ? tasksForDay.join('<br>') : "",
total: tasksForDay.length > 0 ? formatTime(totalMinutes) : "0m"
});
}
// 日付を降順で並び替え
tasksByDate.sort((a, b) => new Date(b.date) - new Date(a.date));
// dv.tableを使ってテーブル表示
dv.table(
"日付", "タスクリスト", "実績", // ヘッダー
tasksByDate.map(row => row.date, row.tasks, row.total) // 行データ
);
});
`
タスクがある日のみ表示
code:js
`dataviewjs
// 時間と分のフォーマット関数
function formatTime(minutes) {
let hours = Math.floor(minutes / 60);
let remainingMinutes = minutes % 60;
if (hours > 0) {
return ${hours}h${remainingMinutes}m;
} else {
return ${remainingMinutes}m;
}
}
// 曜日を日本語の一文字に変換する関数
function getJapaneseDayOfWeek(day) {
const daysInJapanese = {
"Sunday": "日",
"Monday": "月",
"Tuesday": "火",
"Wednesday": "水",
"Thursday": "木",
"Friday": "金",
"Saturday": "土"
};
return daysInJapaneseday;
}
// フィルターキーワードを取得するテキストボックスを作成
let filterInput = document.createElement('input');
filterInput.type = 'text';
filterInput.placeholder = 'フィルターキーワードを入力';
filterInput.style.marginBottom = '10px';
filterInput.style.width = '100%';
// "フィルタ" ボタンを作成
let filterButton = document.createElement('button');
filterButton.innerText = 'フィルタ';
filterButton.style.display = 'block';
filterButton.style.marginBottom = '20px';
// テキストボックスとボタンを最初に表示
dv.container.appendChild(filterInput);
dv.container.appendChild(filterButton);
// ボタンがクリックされたときのイベントリスナー
filterButton.addEventListener('click', async () => {
let filterKeyword = filterInput.value; // テキストボックスからキーワードを取得
let filterEnabled = filterKeyword.length > 0;
// 再検索の際に以前のテーブルやコンテンツをクリア
dv.container.innerHTML = "";
// 検索UIを再度表示
dv.container.appendChild(filterInput);
dv.container.appendChild(filterButton);
// 今日の日付を取得
let today = window.moment().startOf('day');
// 過去30日分の日付を取得
let startDate = today.clone().subtract(30, 'days');
// 日別タスクリストと実績時間を格納するオブジェクト
let tasksByDate = [];
// データビュープラグインを利用して過去30日分のタスクを取得
for (let i = 0; i <= 30; i++) {
let currentDate = startDate.clone().add(i, 'days');
let filePath = notes/${currentDate.format('YYYY-MM-DD')}.md; // デイリーノートのパス
let tasksForDay = [];
let totalMinutes = 0;
if (await app.vault.adapter.exists(filePath)) {
let fileContent = await dv.io.load(filePath);
let lines = fileContent.split('\n');
// 各行を確認して開始時刻、実績時間、タスクを抽出
lines.forEach(line => {
let match = line.match(/(\d{2}:\d{2})\s+(\d+)\s*\\\s*(.*)/); // 開始時刻、実績時間、タスク内容を正規表現で抽出
if (match) {
let startTime = match1; // 開始時刻
let minutes = parseInt(match2, 10); // 実績時間を数値に変換
let task = match3; // タスク内容
// ()内を削除してリンク部分を省略
task = task.replace(/\[(^\]+)\]\(^\)+\)/g, "$1");
// フィルター条件に一致するタスクのみ表示
if (!filterEnabled || task.includes(filterKeyword)) {
tasksForDay.push(${startTime} ${task} (${formatTime(minutes)}));
totalMinutes += minutes; // 実績時間を足し合わせる
}
}
});
// 日付ごとのタスクリストと実績時間の合計を保存
if (tasksForDay.length > 0) {
let dayOfWeek = getJapaneseDayOfWeek(currentDate.format('dddd')); // 曜日を取得して日本語の一文字に変換
tasksByDate.push({
date: ${currentDate.format('YYYY/M/D')} (${dayOfWeek}),
tasks: tasksForDay.join('<br>'),
total: formatTime(totalMinutes)
});
}
}
}
// 日付を降順で並び替え
tasksByDate.sort((a, b) => new Date(b.date) - new Date(a.date));
// dv.tableを使ってテーブル表示
dv.table(
"日付", "タスクリスト", "実績", // ヘッダー
tasksByDate.map(row => row.date, row.tasks, row.total) // 行データ
);
});
`